﻿#pragma once
#include "XyNet/Channel/RpcChannel.h"
#include "XyNet/Common/Id.h"

namespace XyNet
{
	class RpcArgument;
	class RpcMessage;
	class RpcSocketChannel;
	class RpcSocketChannelManager;

	/// RPC广播通道
	class XYNET_API RpcBroadcastChannel : public RpcChannel
	{
	public:
		/// 广播类型
		enum BroadcastType
		{
			AllUsers,	// 所有用户
			LoginUsers,	// 登录用户
			SpecifiedUsers,	// 指定用户
			Invalid
		};

	public:
		RpcBroadcastChannel(RpcSocketChannelManager* socketChannelManager);
		virtual ~RpcBroadcastChannel();

		/// 设置广播所有用户
		void setBroadcastAllUsers();
		/// 设置广播登录用户
		void setBroadcastLoginUsers();
		/// 设置广播指定用户
		void setBroadcastSpecifiedUser(const Id& userId);
		/// 设置广播指定用户列表
		void setBroadcastSpecifiedUsers(const vector<Id>& userIds);

	private:
		/// 生成消息
		shared_ptr<RpcMessage> createMessage(
			RpcMethod* method, shared_ptr<const RpcArgument> argument);
		/// 生成广播套接字通道列表
		vector<shared_ptr<RpcSocketChannel>> makeBroadcastSocketChannels();

		/// 调用方法
		virtual void callMethod(RpcMethod* method, shared_ptr<RpcCallback> callback) override;
		///// 发送数据
		//virtual void sendData(const Bytes& data) override;

	private:
		/// 广播类型
		BroadcastType _broadcastType;
		/// 指定的用户id列表
		vector<Id> _specifiedUserIds;

		/// 连接通道管理器
		RpcSocketChannelManager* _socketChannelManager;
	};
}